package cp4.work;

import cp4.work.data.Cart;
import cp4.work.data.Goods;
import cp4.work.data.GoodsData;
import util.StringUtil;

import javax.servlet.ServletException;
import javax.servlet.annotation.WebServlet;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import javax.servlet.http.HttpSession;
import java.io.IOException;
import java.io.PrintWriter;
import java.util.Collection;
import java.util.HashMap;
import java.util.Map;

@WebServlet("/cp4/work/carts")
// 购物车servlet
public class CartsServlet extends HttpServlet {
    // 购物车数据在session里面的名称
//    private static final String CARTS_DATA_NAME = "carts";
    @Override
    protected void doGet(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // 注意需要判断是否已经登录

        if(req.getSession().getAttribute("login_username") == null){
            StringUtil.getWriter(resp).println("请先登录");
            return;
        }


        String type = req.getParameter("type");
        // 将商品添加到购物车
        if (type != null && type.equalsIgnoreCase("add")) {
            doAdd(req, resp);
        } else {
            //显示购物车的所有商品
            doShow(req, resp);
        }
    }

    // 此处应该使用包装类
//    private Map<Integer, Cart> cartsData = new HashMap<>();

    private void doShow(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Map<Integer, Cart> carts = null;
        HttpSession session = req.getSession();//获取session
        carts = (Map<Integer, Cart>) session.getAttribute("carts");//从session获取购物车数据
        PrintWriter out = StringUtil.getWriter(resp);
        if (carts == null) { // 第一次session中没有购物车数据
            out.println("您还没有添加任何商品");
            return;
        }
        Collection<Cart> cartsList = carts.values(); // 获取到所有的购物车数据
        // 遍历循环
        for (Cart c : cartsList) {
            // 根据购物车中的id获取商品信息
            Goods g = GoodsData.goodsList.get(c.getId());
            out.println(g.getTitle() + "   单价:" + g.getPrice() + "  数量:" + c.getCount() + "  小计:" + c.getPrice());
            out.println("<br>");
        }
    }


    /**
     * 添加商品到购物车
     *
     * @param req
     * @param resp
     */
    private void doAdd(HttpServletRequest req, HttpServletResponse resp) throws IOException {
        Map<Integer, Cart> carts = null;
        HttpSession session = req.getSession();//获取session
        carts = (Map<Integer, Cart>) session.getAttribute("carts");//从session获取购物车数据
        if (carts == null) { // 第一次session中没有购物车数据
            carts = new HashMap<>();//创建一个信息的数据
        }
        // 获取要添加的商品信息
        int id = Integer.parseInt(req.getParameter("id")); // 注意应该判断参数是否正确，此处省略
        // 根据id获取商品信息
        Goods g = GoodsData.goodsList.get(id);
        // 判断购物车中是否已经存在该商品
        if (carts.containsKey(id)) {
            // 已经存在了该商品
            int newCount = carts.get(id).getCount() + 1;//获取商品原数量 并 + 1
            carts.get(id).setCount(newCount); // 重新设置数量
            carts.get(id).setPrice(newCount * g.getPrice()); // 设置小计价格
        } else {
            carts.put(id, new Cart(id, 1, g.getPrice()));
        }
        // 购物车数据更新后 需要重新加到session
        session.setAttribute("carts", carts); // 重新设置数据 进行覆盖
        PrintWriter writer = StringUtil.getWriter(resp);
        writer.println("添加购物车成功!");
    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        doGet(req, resp);
    }


}
